// 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。

// 不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

// 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

//  通过
var removeElement = function(nums, val) {
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] == val) {
            nums.splice(i, 1);
            i--;
        }
    }
};

// 定位删除法
var removeElement = (nums, val) => {
    while (nums.indexOf(val) !== -1) {
        nums.splice(nums.indexOf(val), 1)
    }
    return nums.length
}

// 覆盖法
var removeElement = (nums, val) => {
        let index = 0
        for (let i = 0; i < nums.length; i++) {
            if (nums[i] !== val) {
                nums[index] = nums[i]
                index++
            }
        }
        return index
            // 返回的覆盖长度,也就是数组长
    }
    //  只要没有找到相同的,就不断覆盖之前的数组,当有相同的元素时,继续向前寻找

//双指针（尾项覆盖）？？？
var removeElement = (nums, val) => {
        let index = 0,
            last = nums.length - 1
        while (index <= last) {
            if (nums[index] === val) {
                nums[index] = nums[last]
                last--
            } else {
                index++
            }
        }
        return index
    }
    //  指向头尾的双指针
    // 遇到等于val的项，就拿数组的末尾项覆盖它
    // 末尾项搬到前面来了，将尾指针左移一位
    // 如果遇到不同于val的项，左指针就+1，考察下一项
    // 循环结束的条件是两个指针交叉相遇